/**
 * @description 校验是否是十六进制颜色
 * @param {String} value 校验内容
 * @return {Boolean}
 * @example isHexColor(value)
 */
export function isHexColor(value) {
  return /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/.test(value)
}

/**
 * @description 校验是否是邮箱
 * @param {String} value 校验内容
 * @return {Boolean}
 * @example isEmail(value)
 */
export function isEmail(value) {
  return /[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?/.test(value)
}

/**
 * @description 校验是否是电话号码
 * @param {String} value 校验内容
 * @return {Boolean}
 * @example isPhoneNo(value)
 */
export function isPhoneNo(value) {
  return /^1[1-9]\d{9}$/.test(value)
}

/**
 * @description 校验是否是URL格式
 * @param {String} value 校验内容
 * @return {Boolean}
 * @example isUrl(value)
 */
export function isUrl(value) {
  // eslint-disable-next-line no-useless-escape
  return /http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w-.\/?%&=]*)?/.test(value)
}

/**
 * 校验链接是否为图片
 * @param {string} link - 要校验的链接
 * @return {boolean} - 如果链接是图片链接，则返回 true；否则返回 false
 */
export function isImage(link) {
  const reg = /\.(jpeg|jpg|gif|png|bmp|webp)$/i
  return reg.test(link)
}

/**
 * @description 校验是否是日期格式
 * @param {String|Date} value 校验内容
 * @return {Boolean}
 * @example isDate(value)
 */
export function isDate(value) {
  return !/Invalid|NaN/.test(new Date(value).toString())
}

/**
 * @description 校验是否是整数
 * @param {*} value 校验内容
 * @return {Boolean}
 * @example isDigits(value)
 */
export function isDigits(value) {
  return /^\d+$/.test(value)
}

/**
 * @description 校验是否是身份证号码
 * @param {String} value 校验内容
 * @return {Boolean}
 * @example isIdCard(value)
 */
export function isIdCard(value) {
  return /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value)
}

/**
 * @description 校验是否是车牌号
 * @param {String} value 校验内容
 * @return {Boolean}
 * @example isCarNo(value)
 */
export function isCarNo(value) {
  // 新能源车牌
  const xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/
  // 旧车牌
  const creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/
  if (value.length === 7) {
    return creg.test(value)
  } else if (value.length === 8) {
    return xreg.test(value)
  } else {
    return false
  }
}

/**
 * @description 校验是否是金额 两位小数
 * @param {String|Number} value 校验内容
 * @return {Boolean}
 * @example isAmount(value)
 */
export function isAmount(value) {
  return /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0\.\d{1,2}$/.test(value)
}

/**
 * @description 校验是否是中文
 * @param {String} value 校验内容
 * @return {Boolean}
 * @example isChinese(value)
 */
export function isChinese(value) {
  let reg = /^[\u4e00-\u9fa5]+$/gi
  return reg.test(value)
}

/**
 * @description 校验是否是字母
 * @param {String} value 校验内容
 * @return {Boolean}
 * @example isLetter(value)
 */
export function isLetter(value) {
  return /^[a-zA-Z]*$/.test(value)
}

/**
 * @description 校验是否是数字
 * @param {String|Number} value 校验内容
 * @return {Boolean}
 * @example isNumber(value)
 */
export function isNumber(value) {
  return /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value)
}

/**
 * 检查给定的值是否为错误类型
 * @param {*} value - 要检查的值
 * @returns {boolean} - 如果值是错误类型，则返回true；否则返回false
 */
export function isError(value) {
  return value instanceof Error
}

/**
 * 检查给定的值是否为字符串类型
 * @param {*} value - 要检查的值
 * @returns {boolean} - 如果值是字符串类型，则返回true；否则返回false
 */
export function isString(value) {
  return typeof value === "string"
}

/**
 * 判断给定的参数是否为函数
 * @param {*} fn - 需要检查的参数
 * @returns {boolean} 如果给定的参数是函数则返回true，否则返回false
 */
export function isFunction(fn) {
  return typeof fn === "function"
}

/**
 * @description 校验是否是字母或者数字
 * @param {String|Number} value 校验内容
 * @return {Boolean}
 * @example isLetterOrNumber(value)
 */
export function isLetterOrNumber(value) {
  let reg = /^[0-9a-zA-Z]*$/g
  return reg.test(value)
}

/**
 * @description 校验是否包含某个值
 * @param {String} value 校验内容
 * @param {String|Number} param 包含内容
 * @return {Boolean}
 * @example isContains(value, param)
 */
export function isContains(value, param) {
  return value.indexOf(param) >= 0
}

/**
 * @description 校验值大小是否在范围内
 * @param {String|Number} value 校验内容
 * @param {Array} array 值范围 tips: [0,10]
 * @return {Boolean}
 * @example isInRange(value, array)
 */
export function isInRange(value, array) {
  return value >= array[0] && value <= array[1]
}

/**
 * @description 校验值长度是否在范围内
 * @param {String} value 校验内容
 * @param {Array} array 长度范围 tips: [0,10]
 * @return {Boolean}
 * @example isInRangeLength(value, array)
 */
export function isInRangeLength(value, array) {
  return value.length >= array[0] && value.length <= array[1]
}

/**
 * @description 校验是否是固定电话
 * @param {String} value 校验内容
 * @return {Boolean}
 * @example isLandline(value)
 */
export function isLandline(value) {
  let reg = /^\d{3,4}-\d{7,8}(-\d{3,4})?$/
  return reg.test(value)
}

/**
 * @description 校验是否是验证码
 * @param {String|Number} value 校验内容
 * @param {String|Number} len 验证码长度
 * @return {Boolean}
 * @example isCode(value, len)
 */
export function isCode(value, len = 6) {
  return new RegExp(`^\\d{${len}}$`).test(value)
}

/**
 * @description 校验是否是数组
 * @param {*} value 校验内容
 * @return {Boolean}
 * @example isArray(value)
 */
export function isArray(value) {
  if (typeof Array.isArray === "function") {
    return Array.isArray(value)
  } else {
    return Object.prototype.toString.call(value) === "[object Array]"
  }
}

/**
 * @description 校验是否是对象
 * @param {*} value 校验内容
 * @return {Boolean}
 * @example isObject(value)
 */
export function isObject(value) {
  return Object.prototype.toString.call(value) === "[object Object]"
}

/**
 * @description 校验是否是时间戳
 * @param {*} value 校验内容
 * @return {Boolean}
 * @example isTimestamp(value)
 */
export function isTimestamp(value) {
  var timestamp = parseInt(value, 10)
  return !isNaN(timestamp) && timestamp.toString().length === value.toString().length
}

/**
 * @description 校验是否是Json字符串
 * @param {*} value 校验内容
 * @return {Boolean}
 * @example isJsonString(value)
 */
export function isJsonString(value) {
  if (typeof value == "string") {
    try {
      var obj = JSON.parse(value)
      if (typeof obj == "object" && obj) {
        return true
      } else {
        return false
      }
    } catch (e) {
      return false
    }
  }
  return false
}

/**
 * @description 校验是否为空
 * @param {*} value 校验内容
 * @return {Boolean}
 * @example isEmpty(value)
 */
export function isEmpty(value) {
  switch (typeof value) {
    case "undefined":
      return true
    case "string":
      if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, "").length == 0) return true
      break
    case "boolean":
      if (!value) return true
      break
    case "number":
      if (0 === value || isNaN(value)) return true
      break
    case "object":
      if (null === value || value.length === 0) return true
      for (var i in value) {
        return false
      }
      return true
  }
  return false
}

/**
 * @description 校验是否为空数据
 * @param {*} value 校验内容
 * @return {Boolean}
 * @example isNoEmpty(value)
 */
export function isNoEmpty(value) {
  return !isEmpty(value)
}

/**
 * @description 是否布尔值
 * @param {*} value 校验内容
 * @return {Boolean}
 * @example isBoolean(value)
 */
export function isBoolean(value) {
  return typeof value === "boolean"
}
